﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.OleDb;
using Aandelendelen.Db;
using Aandelendelen.Mail;
using Aandelendelen.Obs;
using Aandelendelen.Security;

namespace Aandelendelen.Controls
{
	public partial class RegisterUserControl : BaseUserControl
	{
		protected override void WriteLog()
		{
			logger.Info("Registerform visited");
		}

		protected override void OnFirstHit(object sender, EventArgs e)
		{
			this.DatePickerControl1.YearHigh = DateTime.Now.Year - 17; // user has to be 18 or older
		}

		protected override void OnPostBack(object sender, EventArgs e)
		{
			logger.Info("Registerform pushed enter");

			Page.Validate();

			if (Page.IsValid && this.ValidateCustom())
			{
				this.RegisterUser();

				Response.Redirect("/RegisterConfirmation.aspx", true);
			}
		}

		public string Voorletters { get { return this.tbVoorletters.Text; } }
		public string Tussenvoegsel { get { return this.tbTussenvoegsel.Text; } }
		public string Achternaam { get { return this.tbAchternaam.Text; } }
		public string Woonplaats { get { return this.tbWoonplaats.Text; } }
		public string Email { get { return this.tbEmail.Text; } }
		public string Rekeningnummer { get { return this.tbRekeningnummer.Text; } }
		public string Gebruikersnaam { get { return this.tbGebruikersnaam.Text.Trim().ToLower(); } }
		public bool Geslacht { get { return this.RadioButtonList1.Text == "1"; } }
		public DateTime Geboortedatum { get { return this.DatePickerControl1.SelectedDate; } }
		public string Wachtwoord { get { return this.tbWachtwoord.Text; } }

		protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
		{
			/*
			this.CustomValidator1.Text = "Er kan niet meer ingeschreven worden";
			args.IsValid = false;
			return;
			*/
			//validate username
			try
			{
				args.IsValid = true;

				if (args.Value.Length < 6 || args.Value.Length > 16)
				{
					this.CustomValidator1.Text = "Gebruikersnaam is minimaal zes en maximaal 16 posities lang";

					args.IsValid = false;
				}

				if (args.IsValid)
				{
					Query query = new Query("s_uidexists", "Gebruikersnaam", args.Value, OleDbType.Char);

					int count = (int)query.Execute();

					if (count > 0)
					{
						this.CustomValidator1.Text = "Deze gebruikersnaam is reeds in gebruik. Kies a.u.b. een andere";
						args.IsValid = false;
					}
				}
			}
			catch
			{
				args.IsValid = false;
			}

		}

		protected void CustomValidator2_ServerValidate(object source, ServerValidateEventArgs args)
		{
			//validate wachtwoord
			try
			{
				if (args.Value.Length < 6)
				{
					this.CustomValidator2.Text = "Wachtwoord is minimaal zes posities lang";

					args.IsValid = false;
				}
				else
					args.IsValid = true;
			}
			catch
			{
				args.IsValid = false;
			}

		}

		protected void CustomValidator3_ServerValidate(object source, ServerValidateEventArgs args)
		{
			//validate wachtwoord-nogmaals
			try
			{
				if (args.Value != this.tbWachtwoord.Text)
				{
					this.CustomValidator3.Text = "Wachtwoord-nogmaals en wachtwoord komen niet overeen";

					args.IsValid = false;
				}
				else
					args.IsValid = true;
			}
			catch
			{
				args.IsValid = false;
			}
		}

		protected void CustomValidator4_ServerValidate(object source, ServerValidateEventArgs args)
		{
			if (EMail.IsEmailAddressValid(args.Value))
			{
				args.IsValid = true;
			}
			else
			{
				this.CustomValidator4.Text = "Geen geldig email adres";

				args.IsValid = false;
			}
		}

		private bool ValidateCustom()
		{
			this.lblDateOfBirthError.Text = "";
			this.lblConditionCheckboxError.Text = "";

			bool ok = true;

			ok &= this.ValidateDateOfBirth();
			ok &= this.ValidateConditionCheckbox();

			return ok;
		}

		private bool ValidateConditionCheckbox()
		{
			bool ok = this.CheckBox1.Checked;

			if (!ok)
			{
				this.lblConditionCheckboxError.Text = "Gaat u akkoord met de voorwaarden? Zet hier dan een vinkje.";
			}

			return ok;
		}

		private bool ValidateDateOfBirth()
		{
			DateTime dateOfBirth;

			try
			{
				dateOfBirth = this.Geboortedatum;
			}
			catch
			{
				this.lblDateOfBirthError.Text = "Datum is niet correct.";

				return false;
			}

			DateTime now = DateTime.Now;

			TimeSpan tsAge = now.Subtract(dateOfBirth);

			DateTime age = new DateTime(tsAge.Ticks);

			bool isValid = (age.Year - 1 >= 18); //the 'minus 1' is correct !!

			if (isValid == false)
			{
				this.lblDateOfBirthError.Text = "U dient 18 jaar of ouder te zijn. Het opgeven van een valse geboortedatum is strafbaar!";
			}

			return isValid;
		}

		private void RegisterUser()
		{
			int referrer = 0;
			/*
			Userinfo referrerInfo = null;

			HttpCookie refCookie = Request.Cookies["adref"];
			if (refCookie != null)
			{
				logger.Info("adref cookie found");
				try
				{
					string sReferrer = refCookie.Value.Trim().ToLower();
					if (string.IsNullOrEmpty(sReferrer) == false)
					{
						logger.Info("adref cookie value: " + sReferrer);
						Query query = new Query("s_nawimpersonate", "Gebruikersnaam", sReferrer, OleDbType.Char);

						ResultSet resultSet = (ResultSet)query.Execute();

						if (resultSet.Count == 1)
						{
							referrerInfo = new Userinfo(resultSet, false);
							referrer = referrerInfo.Id;
						}
					}
				}
				catch (Exception e)
				{
					logger.InfoException("Error duren refCookie handling", e);

					referrer = 0;
				}
			}
			*/

			QueryArguments args1 = new QueryArguments();

			args1.Add("Voorletters", this.Voorletters, OleDbType.Char);
			args1.Add("Tussenvoegsel", this.Tussenvoegsel, OleDbType.Char);
			args1.Add("Achternaam", this.Achternaam, OleDbType.Char);
			args1.Add("Woonplaats", this.Woonplaats, OleDbType.Char);
			args1.Add("Geslacht", this.Geslacht, OleDbType.Boolean);
			args1.Add("Geboortedatum", this.Geboortedatum, OleDbType.Date);
			args1.Add("Email", this.Email, OleDbType.Char);
			args1.Add("Rekeningnummer", this.Rekeningnummer, OleDbType.Char);
			args1.Add("Gebruikersnaam", this.Gebruikersnaam, OleDbType.Char);
			args1.Add("Wachtwoord", Hash.GetMD5Hash(this.Wachtwoord), OleDbType.Char);
			args1.Add("Referrer", referrer, OleDbType.Integer);

			Query query1 = new Query("i_newuser", args1);

			QueryArguments args2 = new QueryArguments();

			args2.Add("Gebruikersnaam", this.Gebruikersnaam, OleDbType.Char);
			args2.Add("hashed", Hash.GetMD5Hash(this.Gebruikersnaam), OleDbType.Char);
			args2.Add("Registratiedatum", DateTime.Now, OleDbType.Date);

			Query query2 = new Query("i_newuserwaiting", args2);

			QueryCollection queries = new QueryCollection();
			queries.Add(query1);
			queries.Add(query2);

			queries.Execute();

			logger.Info("User registered {0}", this.Gebruikersnaam);
			//LogWriter.Write("User registered '" + this.Gebruikersnaam + "'" + (referrer > 0 ? ", referrer: " + referrerInfo.Gebruikersnaam : ""));

			Userinfo userInfo = new Userinfo(this.Voorletters, this.Tussenvoegsel, this.Achternaam, this.Geslacht, this.Email);
			MailArguments mailArgs = MailArguments.MailArgs;
			mailArgs.Clear();

			mailArgs["{hasheduid}"] = args2[1].Value.ToString();
			mailArgs["{aanhef}"] = userInfo.MailAanhef;

			EMail email = MailCache.GetMail("activateaccount");
			email.Recipients = this.Email;

			email.QueueSingle();
		}
	}
}